const { app, dialog } = require('electron');
const path = require('path');
const fs = require('fs');
const { promisify } = require('util'); 
const writeFile = promisify(fs.writeFile); 
const readFile = promisify(fs.readFile); 
const mkdir = promisify(fs.mkdir); 

const ini = require('ini');
const logger = require('@utils/logger');

const { defaultConfig } = require('@share/common');
const gs = require('@utils/globalStore');

const CONFIG_FILE_PATH = path.join(app.getPath('userData'), 'config.ini'); // 统一使用此路径
/**
 * 显示错误对话框并退出应用
 * @param {string} message - 错误消息
 */
function showErrorDialogAndQuit(message) {
    dialog.showMessageBox({
        type: 'error',
        title: '配置错误',
        message: message,
        detail: '请检查您的配置文件并重新启动应用。',
        buttons: ['退出']
    }).then((response) => {
        if (response.response === 0) {
            app.quit();
        }
    });
}

/**
 * 显示错误对话框并退出应用
 */
async function showInitializationDialog() {
    try {
        await initializeConfiguration();

        // 添加延迟确保文件写入完成
        await new Promise(resolve => setTimeout(resolve, 500));

        const result = await dialog.showMessageBox({
            type: 'info',
            title: '配置初始化',
            message: '初始启动',
            detail: '已初始化配置，请重新启动应用。',
            buttons: ['退出']
        });

        if (result.response === 0) {
            app.relaunch();
            app.exit(0); // 使用 exit 替代 quit 确保立即退出
        }
    } catch (err) {
        logger.error(`[+10015] 初始化失败: ${err.stack || err.message}`);

        // 终极回退方案：直接退出并提示用户手动创建配置文件
        dialog.showErrorBox(
            '致命错误',
            `无法创建配置文件，请手动创建以下文件：\n${CONFIG_FILE_PATH}`
        );
        app.exit(1);
    }
}

/**
 * 加载指定的 section 和 key 的配置值
 * @param {string} section - 配置文件的 section 名称
 * @param {string} key - 要加载的配置项的 key
 * @returns {Promise<any>} 解析为配置值（如果存在），或在出错时拒绝 Promise。
 */
async function loadConfiguration(section, key) {
    try {
        // 先检查文件是否存在（使用同步方法没问题）
        if (!fs.existsSync(CONFIG_FILE_PATH)) {
            logger.info(`[+10010] 配置文件不存在: ${CONFIG_FILE_PATH}`);
            await showInitializationDialog();
            // 初始化后重新尝试加载
            return await loadConfiguration(section, key);
        }

        // 使用 promisify 改造后的 readFile
        const data = await readFile(CONFIG_FILE_PATH, 'utf-8'); // 注意这里简化了参数
        const config = ini.parse(data);

        logger.info(`[+10001] 配置加载成功`);
        gs.set('config', config);

        if (config[section] && config[section][key] !== undefined) {
            return config[section][key];
        } else {
            throw new Error(`配置项 ${section}.${key} 不存在`);
        }
    } catch (err) {
        logger.error(`[+10012] 配置文件读取失败: ${err.stack || err.message}`);
        throw err;
    }
}

/**
 * 初始化配置文件
 */
async function initializeConfiguration() {
    try {
        const dir = path.dirname(CONFIG_FILE_PATH);
        await mkdir(dir, { recursive: true });

        const iniString = ini.stringify(defaultConfig);
        await writeFile(CONFIG_FILE_PATH, iniString, 'utf-8');

        logger.info(`[+10013] 配置文件创建成功: ${CONFIG_FILE_PATH}`);
        return true;
    } catch (err) {
        logger.error(`[+10013] 配置文件创建失败: ${err.stack || err.message}`);
        throw err;
    }
}

module.exports = {
    loadConfiguration,
    initializeConfiguration,
    showInitializationDialog
};